package QianFeng16.JSON.Simple;

import com.google.gson.stream.JsonReader;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
/**
 * JSON是一种轻量级的数据交换格式。JSON官方：http://www.json.org
 * JSON数据格式的特点
 * 1、"名称/值" 对的集合{名称和值都应用双引号括起，对于整型的数值，可以不用引号}
 * 2、值的有序列表(数组)
 * 举例：
 * "名称/值"对的方式：{"name":"BIN","age":"18","email":"BIN.com"}
 * 数组的方式：
 * {"user":
 *  [{"name":"BIN","age":"18","email":"BIN.com"},
 *   {"name":"VIN","age":"19","email":"VIN.com"}
 *  ]
 * }
 *
 * JSON下载地址：http://www.mvnrepository.com/artifact/com.google.code.gson/gson
 **/
public class JSONDemo {

    /**
     * 解析一个JSON数组
     **/
    @Test
    public void parseJSONNames() {
        InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("src/QianFeng16/JSON/Simple/names.json");
        InputStreamReader in = new InputStreamReader(is);
        //JSON的解析工具（解析器），有参的构造方法，且传入的是：字符输入流Reader，因此上方Thread获取字节输入流需要经过转换
        JsonReader reader = new JsonReader(in);
        //定义保存每个{}json对象的集合
        ArrayList<Name> list = new ArrayList<>();
        try {
            //开始解析数组
            //为什么一开始要先解析数组？
            //因为该json文件的最外层是[]，当被JsonReader(in)读取后就判定为最外层的是数组，所以得一开始先解析数组
            reader.beginArray();
            while (reader.hasNext()) {
                list.add(parseName(reader));//将解析后的具体的每个{}json对象添加至该数组里维护
            }
            //结束解析数组
            reader.endArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(list.toString());
    }

    //解析对象 Name
    private Name parseName(JsonReader jsonReader) {
        Name name = null;
        try {
            //开始解析对象，即解析每个{}json对象，并生成具体的Name对象来维护
            jsonReader.beginObject();
            name = new Name();
            while (jsonReader.hasNext()) {
                String attrName = jsonReader.nextName();
                if ("firstName".equals(attrName)) {
                    name.setFirstName(jsonReader.nextString());
                } else if ("lastName".equals(attrName)) {
                    name.setLastName(jsonReader.nextString());
                } else if ("email".equals(attrName)) {
                    name.setEmail(jsonReader.nextString());
                }
            }
            //结束解析对象
            jsonReader.endObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return name;
    }
}
